package java基础知识;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author coderFu
 * @create 2022/2/10
 * 公共字节码，反射获取类的方法，并调用方法
 */
public class ReflectDemo {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //通过三种方法获取class类对象

        // 1、通过类名.class获取
        Class<Student> studentClass = Student.class;
        System.out.println("第一种方法获取的对象"+studentClass);


        // 2 通过全限定类名获取
        Class<?> aClass = Class.forName("java基础知识.Student");
        System.out.println("第二种方法获取的对象"+aClass);

        //3 通过对象获取
        Class<? extends Student> aClass1 = new Student().getClass();
        System.out.println("第三种方法获取的对象"+aClass);


        //获取构造方法  默认获取无参构造方法
        Constructor<Student> constructor = studentClass.getDeclaredConstructor();
        Student student = constructor.newInstance();

        //通过类对象获取类方法

        Method method = studentClass.getMethod("eat");
        //调用方法
        method.invoke(student);

        //获取私密方法  开启访问权限

        Method privateMethod = studentClass.getDeclaredMethod("privateMethod");
        privateMethod.setAccessible(true);
        privateMethod.invoke(student);

        //获取带参数的方法
        Method addNum = studentClass.getMethod("addNum", int.class, int.class);
        //调用方法，并返回返回值
        Object invoke = addNum.invoke(student, 10, 50);
        System.out.println(invoke.toString());


        //反射可以修改final 变量的值吗？

        /**
         * 分两种情况：
         * 1、当final修饰的成员变量在定义的时候初始化，那么就不能修改了
         * 2、当final修饰的成员对象在定义的时候没有初始化的话，那么就可以通过反射来修改值
         */


    }







}

class Student{

    String name = "xxx";


    public String getName(){
        return this.name;
    }


    public void eat(){
        System.out.println("到了中午十二点要吃饭了。。。。");
    }

    public int addNum(int a, int b){
        return a+b;
    }

    private void privateMethod(){
        System.out.println("这是一个私有方法");
    }





}
